home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NetNews Offline 2
/
NetNews Offline Volume 2.iso
/
news
/
comp
/
std
/
c
/
29
< prev
next >
Wrap
Text File
|
1996-08-06
|
2KB
|
63 lines
Newsgroups: comp.std.c
Path: howland.reston.ans.net!torn!sq!msb
From: msb@sq.com (Mark Brader)
Subject: Re: sizeof(1L) in preprocesor;How to tell sizeof(double)>sizeof(long) ?
Message-ID: <1996Jan5.094122.16151@sq.com>
Organization: SoftQuad Inc., Toronto, Canada
References: <sc3f9vb6gk.fsf@lns101.lns.cornell.edu>
Date: Fri, 5 Jan 1996 09:41:22 GMT
Nobuhiko Katayama (nk@lns598.lns.cornell.edu) writes:
> Dear experts,
> I understand that sizeof(double) cannot be used with #if as
> double is a type name.
This is not the reason. The reason is that the standard requires a
C program to be processed in specific sequence of 8 logical phases
of translation. The #if directive is evaluated during translation
phase 4, but the identifiers "sizeof" and "double" are not understood
to be keywords until translation phase 7.
> Could you tell me where in the standard it says
> that I cannot use sizeof(1.0) or sizeof(1L)... ?
The same reason applies.
Section 5.1.1.2 of the standard (2.1.1.2 in the original ANSI version)
defines the translation phases, and section 6.8.1 (3.8.1) describes
the #if directive. In particular, note the footnote where it points
out that in the expression inside a #if, there are only identifiers
and not keywords.
> is there any portable way to tell whether
> long is longer(shorter) than double in preprocessor stage ?
I can't think of any way.
You *can* use the various characteristics defined in <limits.h> and
<float.h>, as explained in section 5.2.4.2 (2.2.4.2), to find out
various information about the types. In particular, if what you
really want is to choose whichever of the two types can hold the
larger exact integer value, then in practice you need only do:
#include <limits.h>
#include <float.h>
#if LONG_MAX * DBL_EPSILON > 1
typedef long mytype;
#define mytype_format "%ld" /* for printf */
#else
typedef double mytype;
#define mytype_format "%f"
#endif
This may not work if the number of bits in a long is close to the
number of bits in the significand of a double -- I don't want to
think about the exact criteria -- but in practice that won't happen
on any likely machine.
--
Mark Brader | "As penance, I suppose I should read the standard
msb@sq.com | again, but I've already lost as much hair as
SoftQuad Inc., Toronto | I can afford." -- Tom Kelly
My text in this article is in the public domain.